package com.bingo.lenovo.ttmusic;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
/**
 * 在这个Activity中，最难做的一点应该就是拖动SeekBar的滑杆改变播放进度了，这里我考虑再三，用了一个
 * Handler类来处理。
 *Handler在android里负责发送和处理消息。它的主要用途有：
 * 1.按计划发送消息或执行某个Runnanble(使用POST方法)。
 * 2.从其他线程中发送来的消息放入消息队列中，避免线程冲突（常见于更新UI线程）。
 *默认情况下，Handler接受的是当前线程下的消息循环实例（使用Handler(Looper looper)、
 * Handler(Looper looper, Handler.Callback callback)可以指定线程），同时一个消息队
 * 列可以被当前线程中的多个对象进行分发、处理（在UI线程中，系统已经有一个Activity来处理了
 * ，你可以再起若干个Handler来处理）。在实例化Handler的时候，Looper可以是任意线程的，只要
 * 有Handler的指针，任何线程也都可以sendMessage。Handler对于Message的处理不是并发的。一个
 * Looper 只有处理完一条Message才会读取下一条，所以消息的处理是阻塞形式的（handleMessage()
 * 方法里不应该有耗时操作，可以将耗时操作放在其他线程执行，操作完后发送Message（通过sendMessges
 * 方法）,然后由handleMessage()更新UI）。
 * */
//    1.声明一下变量
    private Button btnStart,btnStop,btnNext,btnLast;
    private TextView txtInfo;
    private ListView listView;
    private SeekBar seekBar;
    private MusicService musicService;
    private MusicHandler musicHandler;//改变进度条事件
    private MusicThread musicThread;//自动改变进度条的进程
    private boolean autoChange,manulChange;//判断进度条是自动改变还是手动改变
    private boolean isPause;//判断是从暂停中恢复还是重新播放
//  2.ListView填充方法
    private void setListViewAdapter(){
        List<Map<String,Object>> date = new ArrayList<Map<String,Object>>();

        for(String path:musicService.musicList){
            Map<String,Object> map = new HashMap<String,Object>();
            File file = new File(path);
            map.put("fileName",file.getName());
            date.add(map);
        }
        SimpleAdapter adapter = new SimpleAdapter(this,date,
                android.R.layout.simple_list_item_1,new String[]{"fileName"},new int[]{android.R.id.text1});
        listView.setAdapter(adapter);
    }
  /*  SimpleAdapter的构造函数是：
    public SimpleAdapter (Context context, List<? extends Map<String, ?>> data,
     int resource, String[] from, int[] to)；
    第一个参数context，是指在哪个Activity中显示。
    第二个参数是一个泛型作为数据源，而且每一个List中的一行就代表着呈现出来的一行，
    Map的键就是这一行的列名，值也是有列名的。
    第三个参数为资源文件，就是说要加载这个列所需要的视图资源文件，我直接引用系统内
    置的资源，如果你想要漂亮的样式可以自己写的。
    第四个参数是一个String数组，主要是将Map对象中的名称映射到列名，一一对应。
    第五个是将第四个参数的值一一对象的显示（一一对应）在接下来的int形的id数组中，
    这个id数组就是Layout的xml文件中命名id形成的唯一的int型标识符。*/

//    3.SeekBar停止拖动后的事件
    public void onStopTrackingTouch(SeekBar seekBar){//停止拖动
        int progress = seekBar.getProgress();
        if(!autoChange&&manulChange){
            int musicMax = musicService.player.getDuration();//得到该首歌曲最长秒数
            int seekBarMax = seekBar.getMax();
            musicService.player.seekTo(musicMax*progress/seekBarMax);//跳到该曲秒
            musicService.pasue();
            autoChange = true;
            manulChange = false;
        }
    }
    class  MusicHandler extends Handler{
        public MusicHandler(){

        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(autoChange){
                try {
                    int position = musicService.player.getCurrentPosition();//得到当前歌曲播放的进度
                    int mMax = musicService.player.getDuration();//最大秒数
                    int sMax = seekBar.getMax();//seekBar最大值，算百分比
                    seekBar.setProgress(position*sMax/mMax);
                    txtInfo.setText(setPlayInfo(position/1000,mMax/1000));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }else {
                seekBar.setProgress(0);
                txtInfo.setText("播放已经停止");
            }
        }
        //设置当前播放的信息
        private String setPlayInfo(int position,int max) {
            String info = "正在播放" + musicService.songName + "\t\t";

            //笨方法写完才想起来用%的，但不想改了
            int pMinutes = 0;
            while (position >= 60) {
                pMinutes++;
                position -= 60;
            }

            String now = (pMinutes<10?"0"+pMinutes:pMinutes)+":"+
                    (position<10?"0"+position:position);

            int mMinutes = 0;
            while (max>=60){
                mMinutes++;
                max-=60;
            }
            String all = (mMinutes<10?"0"+mMinutes:mMinutes)+":"+(max<10
            ?"0"+max:max);

            return info+now+"/"+all;
        }
    }
    class  MusicThread implements Runnable{

        @Override
        public void run() {
            while (true){

                try {
                    musicHandler.sendMessage(new Message());
                    Thread.sleep(1000);//每间隔1秒发送一次更新消息
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnStart = (Button) findViewById(R.id.play);
    }
}
